Skip to content

Gate balance effects and FIO refresh on engine readiness (wallet cache v2)#6080

Open
j0ntz wants to merge 2 commits into
developfrom
jon/wallet-cache-v2
Open

Gate balance effects and FIO refresh on engine readiness (wallet cache v2)#6080
j0ntz wants to merge 2 commits into
developfrom
jon/wallet-cache-v2

Conversation

@j0ntz

@j0ntz j0ntz commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

CHANGELOG

Does this branch warrant an entry to the CHANGELOG?

  • Yes
  • No

Dependencies

EdgeApp/edge-core-js#733

Requirements

If you have made any visual changes to the GUI. Make sure you have:

  • Tested on iOS device
  • Tested on Android device
  • Tested on small-screen device (iPod Touch)
  • Tested on large-screen device (tablet)

Description

GUI-side patches for wallet cache v2 phase 1 (TDD section 7: immutable snapshot). With EdgeApp/edge-core-js#733, wallet objects exist before their engines load and waitForAllWallets resolves in that window, so the login-path surfaces that consumed engine state at resolve-time are gated on engine readiness:

  • checkActionEffect.ts (address-balance): reported the effect against balanceMap immediately after awaiting the wallet, which could now evaluate cached, possibly stale balances. It reports not-yet-effective until the engine has fully synced (same conservatism as the loan flow's waitForLoanAccountSync and the existing < 1 treatment in spend paths, TDD 7.4), letting the action queue's normal 15s poll re-check.
  • Services.tsx: the post-waitForAllWallets FIO refreshes (refreshConnectedWallets, refreshAllFioAddresses) call wallet.otherMethods.*, which the core guarantees is {} pre-engine. A new waitForWalletOtherMethods util watches otherMethods until the engine's methods land (10-minute safety-valve timeout, roughly matching how long waitForAllWallets could already take on large accounts before the cache existed).
  • FioService.ts: the periodic expired-domain check calls otherMethods.getFioAddresses the same way. This one was NOT in the TDD's section-7 audit; it was caught live on the simulator (red dev alert wallet.otherMethods.getFioAddresses is not a function seconds after a warm cached login). Being a 30s periodic task, it skips pre-engine wallets and lets the next cycle retry, which also avoids wedging its one-shot expiredChecking latch when no wallet is ready yet.

Remaining otherMethods call sites (FIO scenes, staking, WalletConnect) are user-navigation surfaces audited in the TDD as safe (null-probes, or flows that imply an engine exists) and are unchanged.

Tested on the iOS simulator against the linked core build (edge-funds, 194 wallets): cold login wrote all 194 walletCache.json files; warm relaunch rendered the full wallet list with names and balances from the cache while engines were still loading; no FIO alert through 140s of runtime; drilling into a wallet shows live engine-backed data on the same wallet object. Screenshots attached below.

Phase 2: tap-prioritization

The core now staggers cached wallets' engine startup through a limited-concurrency queue (EdgeApp/edge-core-js#733 phase 2). withWallet wraps every wallet-scoped scene, so opening one calls account.waitForCurrencyWallet(walletId), which moves that wallet's engine startup to the front of the queue. The call is a fire-and-forget hint; a deleted or broken wallet is already handled by the existing goBack effect.

Post-implementation retrospective (estimate vs. actuals, spec gaps found during implementation): https://gist.github.com/j0ntz/b4476ff5d593b6b206ef17d8c6b260d6#11-post-implementation-retrospective

Asana: https://app.asana.com/1/9976422036640/project/1213843652804305/task/1216673467164267


Note

Medium Risk
Touches post-login FIO refresh, periodic FIO expiry checks, and action-queue balance gating—areas that can mis-fire or stall if readiness checks are wrong, but changes are conservative (defer until sync/engine methods exist).

Overview
Adapts the GUI to wallet cache v2, where wallet objects can appear before their engines load and waitForAllWallets may resolve in that window.

Action queue: address-balance effects no longer treat cached balanceMap as authoritative; they stay not effective until syncStatus.totalRatio reaches DONE_THRESHOLD, then re-check on the existing 15s delay.

Login FIO path: After waitForAllWallets, Services waits per FIO wallet via new waitForWalletOtherMethods (watches otherMethods, 10‑minute timeout, per-wallet errors logged) and bails if the account logged out before running refreshConnectedWallets / refreshAllFioAddresses.

FioService: The periodic expiry check only runs against wallets with getFioAddresses; pre-engine wallets are skipped for retry on the next cycle, and expiredChecking is cleared in finally so errors or empty runs cannot wedge the latch.

Navigation: withWallet calls account.waitForCurrencyWallet(walletId) when opening wallet-scoped scenes so the core prioritizes that engine in the post-login queue.

Reviewed by Cursor Bugbot for commit 99b80e3. Bugbot is set up for automated code reviews on this repo. Configure here.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@j0ntz

j0ntz commented Jul 18, 2026

Copy link
Copy Markdown
Contributor Author

📸 Test evidence (iOS sim, edge-funds)

agent proof 1216673467164267 01 cold login wallet list

agent proof 1216673467164267 01 cold login wallet list

agent proof 1216673467164267 02 warm login cached wallet list

agent proof 1216673467164267 02 warm login cached wallet list

agent proof 1216673467164267 03 wallet detail engine loaded

agent proof 1216673467164267 03 wallet detail engine loaded

Captured by the agent's in-app test run (build-and-test).

Comment thread src/components/services/Services.tsx
Comment thread src/components/services/FioService.ts Outdated
Comment thread src/util/waitForWalletOtherMethods.ts
@j0ntz
j0ntz force-pushed the jon/wallet-cache-v2 branch from 00faa89 to 7f1149f Compare July 18, 2026 01:10
Comment thread src/components/services/Services.tsx
@j0ntz

j0ntz commented Jul 18, 2026

Copy link
Copy Markdown
Contributor Author

📸 Test evidence (after review fixes)

agent proof 1216673467164267 04 warm login after review fixes

agent proof 1216673467164267 04 warm login after review fixes

Captured by the agent's in-app test run (build-and-test).

With the core's wallet cache (wallet cache v2 phase 1), wallet objects
exist before their engines load, and waitForAllWallets resolves in that
window. Three login-path surfaces consumed engine state immediately:

- The action queue's address-balance effect read balanceMap right after
  awaiting the wallet, which could evaluate a balance effect against
  cached, possibly stale balances. It now reports not-yet-effective
  until the engine has fully synced, matching the conservatism the loan
  flow already applies.
- The FIO address refresh called otherMethods on pre-engine wallets,
  which is {} in that window. Services now waits for each FIO wallet's
  engine-backed otherMethods (bounded by a generous safety-valve
  timeout) before refreshing.
- FioService's periodic expired-domain check called
  otherMethods.getFioAddresses the same way (caught live on the sim).
  It now skips pre-engine wallets and lets the next 30s cycle retry,
  which also avoids wedging its one-shot expiredChecking latch.
@j0ntz
j0ntz force-pushed the jon/wallet-cache-v2 branch from 7f1149f to 0a089ca Compare July 18, 2026 01:31
Comment thread src/controllers/action-queue/runtime/checkActionEffect.ts
The core's new post-login queue staggers cached wallets' engine
startup. withWallet covers every wallet-scoped scene, so opening one
calls waitForCurrencyWallet, which moves that wallet's engine to the
front of the queue.

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code Review

Claude Code Review is paused for this repository. To reconnect it, an admin of this repository's GitHub organization (or the account owner, for personal repositories) who can also manage your Claude organization's Code Review settings needs to re-link GitHub in Code Review settings. This is a one-time step.

Tip: disable this comment in your organization's Code Review settings.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 99b80e3. Configure here.

Comment thread src/components/services/Services.tsx
Comment thread src/util/waitForWalletOtherMethods.ts
@j0ntz

j0ntz commented Jul 19, 2026

Copy link
Copy Markdown
Contributor Author

📸 Test evidence (phase 2: warm login + tap-prioritization)

agent proof 1216673467164267 05 warm login list

agent proof 1216673467164267 05 warm login list

agent proof 1216673467164267 06 sepolia detail after tap

agent proof 1216673467164267 06 sepolia detail after tap

Captured by the agent's in-app test run (build-and-test).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant